package com.flxz.service.impl;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.flxz.dto.ParseResponse;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import com.flxz.service.SAALLMService;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.time.LocalDate;

@Service
public class SAALLMServiceImpl implements SAALLMService {
    private final ChatClient chatClient;

    @Autowired
    public SAALLMServiceImpl(@Qualifier("dpChatClient") ChatClient chatClient) {
        this.chatClient = chatClient;
    }

    private final RestTemplate restTemplate = new RestTemplate();
    private final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public ParseResponse getResult(String meg) throws JsonProcessingException {
        String systempromat = "你是一个专业的中文记账助手，任务是精确解析用户输入的交易信息并转换为JSON格式。\n" +
                "### 输出要求\n" +
                "- 严格按照指定格式输出JSON，不得添加任何说明文字、前缀、后缀或解释。\n" +
                "- 确保JSON格式正确，所有字符串值使用双引号包裹。\n" +
                "\n" +
                "### 字段定义\n" +
                "- type: 交易类型，只能是'income'或'expense'\n" +
                "- categoryName: 交易分类，必须从以下选项中选择\n" +
                "  - 支出分类：餐饮、交通、购物、娱乐、医疗、住房、教育、其他\n" +
                "  - 收入分类：工资、奖金、投资、兼职、其他\n" +
                "- amount: 交易金额，必须是数字，单位为元\n" +
                "- remark: 交易备注，提取用户输入中的关键描述，可为空字符串\n" +
                "- date: 交易日期，格式为YYYY-MM-DD，未提供时使用当前日期：" + LocalDate.now() + "\n" +
                "\n" +
                "### 判断规则\n" +
                "1. **交易类型判断**\n" +
                "   - 包含'收入'、'赚了'、'发了'、'收到'、'奖金'、'工资'、'入账'、'进账'等关键词 → income\n" +
                "   - 包含'消费'、'购买'、'花费'、'支出'、'花了'、'用了'、'买了'、'付款'、'付了'等关键词 → expense\n" +
                "   - 无明确关键词时，默认判定为expense\n" +
                "\n" +
                "2. **金额提取**\n" +
                "   - 提取数字部分作为金额，忽略'元'、'块'等单位\n" +
                "   - 如'3元'、'¥50'、'100块'均提取为对应的数字\n" +
                "\n" +
                "3. **分类匹配**\n" +
                "   - 根据用户输入的物品或服务类型匹配最适合的分类\n" +
                "   - 例如：餐饮包括各类食物和饮料；交通包括打车、公交、地铁等\n" +
                "\n" +
                "### 示例\n" +
                "输入：可乐，3元 → {\"type\":\"expense\",\"categoryName\":\"餐饮\",\"amount\":3,\"remark\":\"可乐\",\"date\":\"" + LocalDate.now() + "\"}\n" +
                "输入：工资8000元 → {\"type\":\"income\",\"categoryName\":\"工资\",\"amount\":8000,\"remark\":\"\",\"date\":\"" + LocalDate.now() + "\"}\n" +
                "输入：打车20块钱 → {\"type\":\"expense\",\"categoryName\":\"交通\",\"amount\":20,\"remark\":\"打车\",\"date\":\"" + LocalDate.now() + "\"}\n" +
                "输入：今天买了一件衣服花了350 → {\"type\":\"expense\",\"categoryName\":\"购物\",\"amount\":350,\"remark\":\"买了一件衣服\",\"date\":\"" + LocalDate.now() + "\"}\n" +
                "输入：收到兼职收入500元 → {\"type\":\"income\",\"categoryName\":\"兼职\",\"amount\":500,\"remark\":\"兼职收入\",\"date\":\"" + LocalDate.now() + "\"}\n";

       String result = chatClient.prompt()
               .system(systempromat)
               .user( meg)
               .call()
               .content();
        String json = "";
        if (result != null) {
            json = extractJson(result);
        }
        System.out.println("提取的JSON: " + json); // 调试日志

        JsonNode j = objectMapper.readTree(json);
        ParseResponse out = new ParseResponse();
        out.setType(j.path("type").asText("expense"));
        out.setCategoryName(j.path("categoryName").asText(""));
        out.setAmount(j.path("amount").isNumber() ? j.path("amount").asDouble() : null);
        out.setRemark(j.path("remark").asText(""));
        out.setDate(j.path("date").asText(LocalDate.now().toString()));
        return out;
    }


    private String extractJson(String content) {
        String s = content.trim();

        // 移除可能的代码块标记
        s = s.replaceAll("```json\\s*", "").replaceAll("```\\s*", "");

        // 查找第一个 { 到最后一个 }
        int start = s.indexOf('{');
        int end = s.lastIndexOf('}');

        if (start >= 0 && end > start) {
            String json = s.substring(start, end + 1);
            // 简单验证是否为有效JSON
            try {
                objectMapper.readTree(json);
                return json;
            } catch (Exception e) {
                System.out.println("JSON验证失败: " + json + ", 错误: " + e.getMessage());
            }
        }

        // 如果都失败了，尝试直接返回
        return s;
    }
}
